package com.en.effectiveJava.chapter2.staticFactory1;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 服务{@link Service} 注册和获取中心
 *  服务提供者{@link Provider} 可以通过 registerProvider 方法进行服务注册
 *  客户端可以通过 newInstance 方法获取服务对象
 * Create by EN
 * On 23/05/18 1:00 PM
*/
public class Services {

    /**
     * 私有构造器,增强不可实例化的特性
     */
    private Services() { }

    /**
     * 用 ConcurrentHashMap 存放注册的 Provider 对象
     *  ConcurrentHashMap 是线程安全的集合
     */
    private static final Map<String, Provider> providers = new ConcurrentHashMap<>();

    //默认服务提供者注册时的 key
    public static final String DEFAULT_PROVIDER_NAME = "<def>";

    /**
     * 默认服务提供者注册方法
     * @param p
     */
    public static void registerDefaultProvider(Provider p) {
        registerProvider(DEFAULT_PROVIDER_NAME, p);
    }

    /**
     * 服务提供者注册方法
     * @param name
     * @param p
     */
    public static void registerProvider(String name, Provider p) {
        providers.put(name, p);
    }

    /**
     * 客户端获取默认服务对象的方法
     * @return Service
     */
    public static Service newInstance() {
        return newInstance(DEFAULT_PROVIDER_NAME);
    }

    /**
     * 客户端获取服务对象的方法
     * @param name
     * @return Service
     */
    public static Service newInstance(String name) {
        Provider p = providers.get(name);
        if (p == null) {
            throw new IllegalArgumentException("No provider registered with name: " + name);
        }
        return p.newService();
    }

}
